﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Model;
using Model.Models;
using Persistence;
namespace Services
{

    public class GerenciadorVenda
    {
        private IUnitOfWork unitOfWork;
        private bool shared;

        public GerenciadorVenda()
        {
            this.unitOfWork = new UnitOfWork();
            shared = false;
        }

        internal GerenciadorVenda(IUnitOfWork unitOfword)
        {
            this.unitOfWork = unitOfword;
            shared = true;
        }

        public int Inserir(VendaModel vendaModel, int id_empresa)
        {
            TB_VENDA vendaE = new TB_VENDA();
            vendaModel.Id_Status = 1;
            vendaModel.Data_Venda = DateTime.Now;
            vendaModel.Id_Empresa = id_empresa;
            Atribuir(vendaModel, vendaE);
            unitOfWork.RepositorioVenda.Inserir(vendaE);
            unitOfWork.Commit(shared);
            return vendaE.id_venda;
        }

        public decimal valorTotal(IEnumerable<ItemModel> items)
        {
            decimal valor = 0;
            foreach (ItemModel item in items)
            {
                valor += (item.valor * item.quantidade);
            }
            return valor;
        }
        public void Editar(VendaModel vendaModel)
        {
            TB_VENDA vendaE = new TB_VENDA();
            Atribuir(vendaModel, vendaE);
            unitOfWork.RepositorioVenda.Editar(vendaE);
            unitOfWork.Commit(shared);
        }

        public void Remover(int idVenda)
        {
            unitOfWork.RepositorioVenda.Remover(venda => venda.id_venda.Equals(idVenda));
            unitOfWork.Commit(shared);

        }

        private IQueryable<VendaModel> GetQuery()
        {
            IQueryable<TB_VENDA> tb_venda = unitOfWork.RepositorioVenda.GetQueryable();
            var query = from venda in tb_venda
                        select new VendaModel
                        {
                            Id_Venda = venda.id_venda,
                            Id_Empresa = venda.id_empresa,
                            Id_Cliente = venda.id_cliente,
                            ClienteNome = venda.TB_CLIENTE.nome,
                            StatusNome = venda.TB_STATUS.descricao,
                            Id_Status = venda.id_status,
                            Valor_Total = venda.valor_total,
                            Data_Venda = venda.data_venda
                        };
            return query;
        }


        public IQueryable<VendaModel> ObterTodosByEmpresaAberto(int id_empresa)
        {
            return GetQuery().Where(venda => venda.Id_Empresa.Equals(id_empresa)).Where(venda => venda.Id_Status.Equals(1));
        }

        public IQueryable<VendaModel> ObterTodosByEmpresaCozinha(int id_empresa)
        {
            return GetQuery().Where(venda => venda.Id_Empresa.Equals(id_empresa)).Where(venda => venda.Id_Status.Equals(2));
        }

        public IQueryable<VendaModel> ObterTodosByEmpresaTransito(int id_empresa)
        {
            return GetQuery().Where(venda => venda.Id_Empresa.Equals(id_empresa)).Where(venda => venda.Id_Status.Equals(3));
        }

        public IQueryable<VendaModel> ObterTodosByEmpresaFinalizado(int id_empresa)
        {
            return GetQuery().Where(venda => venda.Id_Empresa.Equals(id_empresa)).Where(venda => venda.Id_Status.Equals(4));
        }

        public IQueryable<VendaModel> ObterTodosByEmpresaCancelado(int id_empresa)
        {
            return GetQuery().Where(venda => venda.Id_Empresa.Equals(id_empresa)).Where(venda => venda.Id_Status.Equals(5));
        }

        public IQueryable<VendaModel> ObterTodosByEmpresa(int id_empresa)
        {
            return GetQuery().Where(venda => venda.Id_Empresa.Equals(id_empresa)).OrderBy(venda => venda.Id_Status);
        }

        public void alterarStatus(VendaModel venda)
        {
            if (venda.Id_Status > 3)
                return;

            venda.Id_Status++;
            Editar(venda);
        }

        public List<VendaModel> ObterTodosByCliente(int id_cliente)
        {
            return GetQuery().Where(venda => venda.Id_Cliente.Equals(id_cliente)).Where(venda => venda.Id_Status == 4).ToList();
        }


        public IEnumerable<VendaModel> ObterTodos()
        {
            return GetQuery();
        }

        public VendaModel Obter(int idVenda)
        {
            IEnumerable<VendaModel> vendaEs = GetQuery().Where(vendaModel => vendaModel.Id_Venda.Equals(idVenda));
            return vendaEs.ElementAtOrDefault(0);
        }


        private void Atribuir(VendaModel vendaModel, TB_VENDA vendaE)
        {
            vendaE.id_venda = vendaModel.Id_Venda;
            vendaE.id_empresa = vendaModel.Id_Empresa;
            vendaE.id_status = vendaModel.Id_Status;
            vendaE.id_cliente = vendaModel.Id_Cliente;
            vendaE.valor_total = vendaModel.Valor_Total;
            vendaE.data_venda = vendaModel.Data_Venda;
        }


    }
}
